"""
date:2019/3/6
"""
import socket
import time


class SnakeGUI:

    def __init__(self, size):
        self._square_size = size
        self._snake_data = SnakeData()

    def _event(self):
        """
        不同的方向键对数据进行不同的处理。
        :return:
        """
        if 'up':
            self._snake_data.update_snake('up')
        elif 'down':
            pass
        elif 'left':
            ...
        elif 'right':
            ...
    pass


class SnakeSocket:
    """
    1. 初始化之后就要启动广播来检测网络中是否有服务器，没有自己就当服务器，否则就当客户端。
    """
    def __init__(self, port):
        self._s = socket.socket()
        self._s.setsockopt()
        self._port = port
        self.ip = self._getip()

    def _getip(self):
        start_time = time.time()
        for _ in range(3):
            self._s.sendto('255.255.255.255', self._port)
            data, addr = self._s.recvfrom(1024)
            if data == start_time:
                return addr[0]


    def broadcast_send(self):
        pass
    pass


class SnakeData:
    def __init__(self, ip, border):
        self._ip = ip           # ip用来记录这条数据是自己的，其他都是别人的。
        self._snake_data = [[self._ip]]
        self._random_border = border        # Snake的长度边界。

    def _init_square(self):
        ...

    def update_snake(self, datas):
        """

        :param datas: 一个数组，第一位是IP，后面是一组元组位置(x,y).['192.168.1.1', (2,4)]
        :return:
        """
        for snake in self._snake_data:
            if snake[0] == datas[0]:
                self._snake_data.append(datas[1])

    def show_snake(self):
        """
        将所有的数据在GUI中显示。
        :return:
        """
        return self._snake_data

    def sync_snake(self):
        """
        只将自己更新的那部分数据通过网络发送给服务器。
        :return:
        """
        for snake in self._snake_data:
            if snake[0] == self._ip:
                return snake

    pass
